//! # `std::net::TcpStream` 和 `std::net::TcpListener` 示例
//!
//! `TcpStream` 用于通过 TCP 协议与远程主机进行通信。
//! `TcpListener` 用于监听传入的 TCP 连接。

use std::io::{Read, Write};
use std::net::{TcpListener, TcpStream};
use std::thread;

/// ## `TcpListener`
///
/// `TcpListener` 用于监听传入的 TCP 连接。
///
/// ### `bind`
///
/// `bind` 方法用于将监听器绑定到本地地址。
///
/// ### `incoming`
///
/// `incoming` 方法返回一个迭代器，用于接受传入的连接。
#[test]
pub fn tcp_listener_example() {
    // 绑定到本地地址和端口
    let listener = TcpListener::bind("127.0.0.1:8080").expect("无法绑定到地址");

    // 接受传入的连接
    for stream in listener.incoming() {
        match stream {
            Ok(stream) => {
                // 为每个连接创建一个新线程
                thread::spawn(|| {
                    handle_client(stream);
                });
            }
            Err(e) => {
                eprintln!("连接失败: {}", e);
            }
        }
    }
}

/// ## `TcpStream`
///
/// `TcpStream` 用于通过 TCP 协议与远程主机进行通信。
///
/// ### `connect`
///
/// `connect` 方法用于连接到远程主机。
#[test]
///
pub fn tcp_stream_example() {
    // 连接到远程服务器
    match TcpStream::connect("127.0.0.1:8080") {
        Ok(mut stream) => {
            println!("成功连接到服务器");

            // 向服务器发送数据
            let msg = b"Hello, server!";
            stream.write_all(msg).unwrap();

            // 从服务器读取响应
            let mut buf = [0; 1024];
            match stream.read(&mut buf) {
                Ok(size) => {
                    println!("从服务器接收到: {}", String::from_utf8_lossy(&buf[..size]));
                }
                Err(e) => {
                    eprintln!("从服务器读取数据失败: {}", e);
                }
            }
        }
        Err(e) => {
            eprintln!("连接到服务器失败: {}", e);
        }
    }
}

// 处理客户端连接的函数
fn handle_client(mut stream: TcpStream) {
    let mut buf = [0; 1024];
    match stream.read(&mut buf) {
        Ok(size) => {
            // 将接收到的数据写回客户端
            stream.write_all(&buf[..size]).unwrap();
        }
        Err(e) => {
            eprintln!("从客户端读取数据失败: {}", e);
        }
    }
}
